{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[数据来源](https://kelvins.esa.int/collision-avoidance-challenge/home/)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#导入必要的库\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "from sklearn import preprocessing\n",
    "from sklearn.metrics import mean_squared_error\n",
    "import seaborn as sns\n",
    "from sklearn.compose import ColumnTransformer\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.impute import SimpleImputer\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.preprocessing import OneHotEncoder\n",
    "from sklearn.preprocessing import StandardScaler,MinMaxScaler\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.neural_network import MLPRegressor   #神经网络回归\n",
    "from sklearn.metrics import mean_absolute_error    #平均绝对误差MAE\n",
    "from sklearn.metrics import mean_squared_error    #平均平方误差MSE\n",
    "from sklearn.ensemble import RandomForestRegressor  #随机森林\n",
    "from xgboost import XGBRegressor                   #XGBoost\n",
    "from xgboost import plot_importance                #输出权重\n",
    "from deepforest import CascadeForestRegressor      #深度森林\n",
    "import joblib                                      #保存模型\n",
    "from tqdm import tqdm                              #进度条\n",
    "plt.style.use('classic')\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1.数据清洗"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>event_id</th>\n",
       "      <th>time_to_tca</th>\n",
       "      <th>mission_id</th>\n",
       "      <th>risk</th>\n",
       "      <th>max_risk_estimate</th>\n",
       "      <th>max_risk_scaling</th>\n",
       "      <th>miss_distance</th>\n",
       "      <th>relative_speed</th>\n",
       "      <th>relative_position_r</th>\n",
       "      <th>relative_position_t</th>\n",
       "      <th>...</th>\n",
       "      <th>t_sigma_rdot</th>\n",
       "      <th>c_sigma_rdot</th>\n",
       "      <th>t_sigma_tdot</th>\n",
       "      <th>c_sigma_tdot</th>\n",
       "      <th>t_sigma_ndot</th>\n",
       "      <th>c_sigma_ndot</th>\n",
       "      <th>F10</th>\n",
       "      <th>F3M</th>\n",
       "      <th>SSN</th>\n",
       "      <th>AP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1.566798</td>\n",
       "      <td>5</td>\n",
       "      <td>-10.204955</td>\n",
       "      <td>-7.834756</td>\n",
       "      <td>8.602101</td>\n",
       "      <td>14923.0</td>\n",
       "      <td>13792.0</td>\n",
       "      <td>453.8</td>\n",
       "      <td>5976.6</td>\n",
       "      <td>...</td>\n",
       "      <td>0.147350</td>\n",
       "      <td>58.272095</td>\n",
       "      <td>0.004092</td>\n",
       "      <td>0.165044</td>\n",
       "      <td>0.002987</td>\n",
       "      <td>0.386462</td>\n",
       "      <td>89.0</td>\n",
       "      <td>83.0</td>\n",
       "      <td>42.0</td>\n",
       "      <td>11.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1.207494</td>\n",
       "      <td>5</td>\n",
       "      <td>-10.355758</td>\n",
       "      <td>-7.848937</td>\n",
       "      <td>8.956374</td>\n",
       "      <td>14544.0</td>\n",
       "      <td>13792.0</td>\n",
       "      <td>474.3</td>\n",
       "      <td>5821.2</td>\n",
       "      <td>...</td>\n",
       "      <td>0.059672</td>\n",
       "      <td>57.966413</td>\n",
       "      <td>0.003753</td>\n",
       "      <td>0.164383</td>\n",
       "      <td>0.002933</td>\n",
       "      <td>0.386393</td>\n",
       "      <td>89.0</td>\n",
       "      <td>83.0</td>\n",
       "      <td>42.0</td>\n",
       "      <td>11.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0.952193</td>\n",
       "      <td>5</td>\n",
       "      <td>-10.345631</td>\n",
       "      <td>-7.847406</td>\n",
       "      <td>8.932195</td>\n",
       "      <td>14475.0</td>\n",
       "      <td>13792.0</td>\n",
       "      <td>474.6</td>\n",
       "      <td>5796.2</td>\n",
       "      <td>...</td>\n",
       "      <td>0.039258</td>\n",
       "      <td>57.907599</td>\n",
       "      <td>0.003576</td>\n",
       "      <td>0.164352</td>\n",
       "      <td>0.002967</td>\n",
       "      <td>0.386381</td>\n",
       "      <td>89.0</td>\n",
       "      <td>83.0</td>\n",
       "      <td>42.0</td>\n",
       "      <td>11.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>0.579669</td>\n",
       "      <td>5</td>\n",
       "      <td>-10.337809</td>\n",
       "      <td>-7.845880</td>\n",
       "      <td>8.913444</td>\n",
       "      <td>14579.0</td>\n",
       "      <td>13792.0</td>\n",
       "      <td>472.7</td>\n",
       "      <td>5838.9</td>\n",
       "      <td>...</td>\n",
       "      <td>0.022066</td>\n",
       "      <td>57.993905</td>\n",
       "      <td>0.003298</td>\n",
       "      <td>0.164309</td>\n",
       "      <td>0.002918</td>\n",
       "      <td>0.386400</td>\n",
       "      <td>89.0</td>\n",
       "      <td>83.0</td>\n",
       "      <td>40.0</td>\n",
       "      <td>14.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>0.257806</td>\n",
       "      <td>5</td>\n",
       "      <td>-10.391260</td>\n",
       "      <td>-7.852942</td>\n",
       "      <td>9.036838</td>\n",
       "      <td>14510.0</td>\n",
       "      <td>13792.0</td>\n",
       "      <td>478.7</td>\n",
       "      <td>5811.1</td>\n",
       "      <td>...</td>\n",
       "      <td>0.015075</td>\n",
       "      <td>57.946717</td>\n",
       "      <td>0.003670</td>\n",
       "      <td>0.164172</td>\n",
       "      <td>0.003220</td>\n",
       "      <td>0.386388</td>\n",
       "      <td>89.0</td>\n",
       "      <td>83.0</td>\n",
       "      <td>40.0</td>\n",
       "      <td>14.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1</td>\n",
       "      <td>6.530455</td>\n",
       "      <td>5</td>\n",
       "      <td>-7.561299</td>\n",
       "      <td>-7.254301</td>\n",
       "      <td>2.746782</td>\n",
       "      <td>2392.0</td>\n",
       "      <td>3434.0</td>\n",
       "      <td>74.3</td>\n",
       "      <td>2317.1</td>\n",
       "      <td>...</td>\n",
       "      <td>0.278354</td>\n",
       "      <td>84.677411</td>\n",
       "      <td>0.006980</td>\n",
       "      <td>0.320622</td>\n",
       "      <td>0.004199</td>\n",
       "      <td>0.047385</td>\n",
       "      <td>71.0</td>\n",
       "      <td>88.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1</td>\n",
       "      <td>5.561646</td>\n",
       "      <td>5</td>\n",
       "      <td>-9.315693</td>\n",
       "      <td>-7.468904</td>\n",
       "      <td>7.223137</td>\n",
       "      <td>3587.0</td>\n",
       "      <td>3434.0</td>\n",
       "      <td>99.0</td>\n",
       "      <td>3475.4</td>\n",
       "      <td>...</td>\n",
       "      <td>0.240907</td>\n",
       "      <td>63.860857</td>\n",
       "      <td>0.006402</td>\n",
       "      <td>0.264636</td>\n",
       "      <td>0.003725</td>\n",
       "      <td>0.040020</td>\n",
       "      <td>70.0</td>\n",
       "      <td>87.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>14.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1</td>\n",
       "      <td>5.226504</td>\n",
       "      <td>5</td>\n",
       "      <td>-7.422508</td>\n",
       "      <td>-7.051001</td>\n",
       "      <td>2.956639</td>\n",
       "      <td>7882.0</td>\n",
       "      <td>3434.0</td>\n",
       "      <td>-50.0</td>\n",
       "      <td>-7638.3</td>\n",
       "      <td>...</td>\n",
       "      <td>0.240198</td>\n",
       "      <td>56.764910</td>\n",
       "      <td>0.005906</td>\n",
       "      <td>0.259109</td>\n",
       "      <td>0.003588</td>\n",
       "      <td>0.083247</td>\n",
       "      <td>70.0</td>\n",
       "      <td>87.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>14.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1</td>\n",
       "      <td>3.570013</td>\n",
       "      <td>5</td>\n",
       "      <td>-9.248105</td>\n",
       "      <td>-7.327533</td>\n",
       "      <td>7.425994</td>\n",
       "      <td>26899.0</td>\n",
       "      <td>3434.0</td>\n",
       "      <td>-82.0</td>\n",
       "      <td>-26067.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.124802</td>\n",
       "      <td>30.242768</td>\n",
       "      <td>0.005883</td>\n",
       "      <td>0.174956</td>\n",
       "      <td>0.003408</td>\n",
       "      <td>0.058311</td>\n",
       "      <td>71.0</td>\n",
       "      <td>87.0</td>\n",
       "      <td>21.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>2</td>\n",
       "      <td>6.983474</td>\n",
       "      <td>2</td>\n",
       "      <td>-10.816161</td>\n",
       "      <td>-6.601713</td>\n",
       "      <td>13.293159</td>\n",
       "      <td>22902.0</td>\n",
       "      <td>14348.0</td>\n",
       "      <td>-1157.6</td>\n",
       "      <td>-6306.2</td>\n",
       "      <td>...</td>\n",
       "      <td>0.153332</td>\n",
       "      <td>39.695541</td>\n",
       "      <td>0.009370</td>\n",
       "      <td>0.269965</td>\n",
       "      <td>0.003886</td>\n",
       "      <td>0.339406</td>\n",
       "      <td>73.0</td>\n",
       "      <td>77.0</td>\n",
       "      <td>27.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>10 rows × 103 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   event_id  time_to_tca  mission_id       risk  max_risk_estimate  \\\n",
       "0         0     1.566798           5 -10.204955          -7.834756   \n",
       "1         0     1.207494           5 -10.355758          -7.848937   \n",
       "2         0     0.952193           5 -10.345631          -7.847406   \n",
       "3         0     0.579669           5 -10.337809          -7.845880   \n",
       "4         0     0.257806           5 -10.391260          -7.852942   \n",
       "5         1     6.530455           5  -7.561299          -7.254301   \n",
       "6         1     5.561646           5  -9.315693          -7.468904   \n",
       "7         1     5.226504           5  -7.422508          -7.051001   \n",
       "8         1     3.570013           5  -9.248105          -7.327533   \n",
       "9         2     6.983474           2 -10.816161          -6.601713   \n",
       "\n",
       "   max_risk_scaling  miss_distance  relative_speed  relative_position_r  \\\n",
       "0          8.602101        14923.0         13792.0                453.8   \n",
       "1          8.956374        14544.0         13792.0                474.3   \n",
       "2          8.932195        14475.0         13792.0                474.6   \n",
       "3          8.913444        14579.0         13792.0                472.7   \n",
       "4          9.036838        14510.0         13792.0                478.7   \n",
       "5          2.746782         2392.0          3434.0                 74.3   \n",
       "6          7.223137         3587.0          3434.0                 99.0   \n",
       "7          2.956639         7882.0          3434.0                -50.0   \n",
       "8          7.425994        26899.0          3434.0                -82.0   \n",
       "9         13.293159        22902.0         14348.0              -1157.6   \n",
       "\n",
       "   relative_position_t  ...  t_sigma_rdot  c_sigma_rdot  t_sigma_tdot  \\\n",
       "0               5976.6  ...      0.147350     58.272095      0.004092   \n",
       "1               5821.2  ...      0.059672     57.966413      0.003753   \n",
       "2               5796.2  ...      0.039258     57.907599      0.003576   \n",
       "3               5838.9  ...      0.022066     57.993905      0.003298   \n",
       "4               5811.1  ...      0.015075     57.946717      0.003670   \n",
       "5               2317.1  ...      0.278354     84.677411      0.006980   \n",
       "6               3475.4  ...      0.240907     63.860857      0.006402   \n",
       "7              -7638.3  ...      0.240198     56.764910      0.005906   \n",
       "8             -26067.0  ...      0.124802     30.242768      0.005883   \n",
       "9              -6306.2  ...      0.153332     39.695541      0.009370   \n",
       "\n",
       "   c_sigma_tdot  t_sigma_ndot  c_sigma_ndot   F10   F3M   SSN    AP  \n",
       "0      0.165044      0.002987      0.386462  89.0  83.0  42.0  11.0  \n",
       "1      0.164383      0.002933      0.386393  89.0  83.0  42.0  11.0  \n",
       "2      0.164352      0.002967      0.386381  89.0  83.0  42.0  11.0  \n",
       "3      0.164309      0.002918      0.386400  89.0  83.0  40.0  14.0  \n",
       "4      0.164172      0.003220      0.386388  89.0  83.0  40.0  14.0  \n",
       "5      0.320622      0.004199      0.047385  71.0  88.0   0.0   2.0  \n",
       "6      0.264636      0.003725      0.040020  70.0  87.0  13.0  14.0  \n",
       "7      0.259109      0.003588      0.083247  70.0  87.0  13.0  14.0  \n",
       "8      0.174956      0.003408      0.058311  71.0  87.0  21.0   5.0  \n",
       "9      0.269965      0.003886      0.339406  73.0  77.0  27.0   4.0  \n",
       "\n",
       "[10 rows x 103 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "file_path='train_data.csv'\n",
    "data=pd.read_csv(file_path,parse_dates=True)\n",
    "# data.drop(columns=['c_rcs_estimate','event_id'],inplace=True)   #event_id只记录第几次事件，无效信息。c_rcs_estimate缺失五万多条数据，占比32.49%，所以删去（其余最多缺失九千多条）\n",
    "key=data.keys()\n",
    "data.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# #尝试加入last_risk改进模型 （此模块可以不运行）\n",
    "# nums=data.shape[0]\n",
    "# event_list=data.event_id\n",
    "# risk_list=data.risk\n",
    "# lastrisk_list=[0]*nums\n",
    "# for i in range(nums-1,0,-1):\n",
    "#     if event_list[i]==event_list[i-1]:\n",
    "#         lastrisk_list[i]=risk_list[i-1]\n",
    "# data['last_risk']=lastrisk_list\n",
    "# ind=[i for i in data.index if data.loc[i,'last_risk']==0]\n",
    "# data.drop(index=ind,inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 155523 entries, 0 to 155522\n",
      "Columns: 103 entries, event_id to AP\n",
      "dtypes: float64(100), int64(2), object(1)\n",
      "memory usage: 122.2+ MB\n"
     ]
    }
   ],
   "source": [
    "data.info()     #有100列数值标签 1列字符串标签，需将字符标签转换为数值标签"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "data.drop(columns=['c_rcs_estimate','event_id'],inplace=True)   #event_id只记录第几次事件，无效信息。c_rcs_estimate缺失五万多条数据，占比32.49%，所以删去（其余最多缺失九千多条）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 从数据中划分出预测标签列\n",
    "y = data.risk\n",
    "X = data.drop(['risk'], axis=1)     #预测标签列'risk'\n",
    "\n",
    "# 将数据划分为训练集和测试集\n",
    "X_train_full, X_valid_full, y_train, y_valid = train_test_split(X, y, train_size=0.8, test_size=0.2)\n",
    "\n",
    "#选取标签列，独立字符串标签数小于10且dtype格式为object\n",
    "categorical_cols = [cname for cname in X_train_full.columns if X_train_full[cname].nunique() < 10 and \n",
    "                        X_train_full[cname].dtype == \"object\"]\n",
    "# 选择数值列\n",
    "numerical_cols = [cname for cname in X_train_full.columns if X_train_full[cname].dtype in ['int64', 'float64']]\n",
    "\n",
    "# 只保留数值列和标签列\n",
    "my_cols = categorical_cols + numerical_cols\n",
    "X_train = X_train_full[my_cols].copy()\n",
    "X_valid = X_valid_full[my_cols].copy()\n",
    "labels=my_cols[1:]+[(my_cols[0]+'(%i)')%i for i in range(1,6)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "#处理数值类型数据\n",
    "# numerical_transformer = SimpleImputer(strategy='constant')\n",
    "numerical_transformer =Pipeline(steps=[('imputer',SimpleImputer(strategy='most_frequent')),    #缺失值处理，用众数填充\n",
    "#                                       ('reduce_dim', PCA()),                                    #PCA降维，已经放弃，加了之后效果更差\n",
    "                                        ('scaler', StandardScaler())])               #这里用zscore标准化方法，即x'=(x-u)/sigma,也可以考虑用MinMaxScaler，即0-1归一化\n",
    "#处理字符串类型数据\n",
    "categorical_transformer = Pipeline(steps=[\n",
    "    ('imputer', SimpleImputer(strategy='most_frequent')),               #缺失值处理，用众数填充\n",
    "    ('onehot', OneHotEncoder(handle_unknown='ignore'))                  #忽略未知的分类特征\n",
    "])\n",
    "#捆绑数值和分类数据的预处理\n",
    "preprocessor = ColumnTransformer(transformers=[('num', numerical_transformer, numerical_cols),\n",
    "        ('cat', categorical_transformer, categorical_cols)])\n",
    "preprocessor.fit(X_train)\n",
    "X_train=preprocessor.transform(X_train)\n",
    "X_valid =preprocessor.transform(X_valid)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "本文用到了许多sklearn中库的函数，详情请见 https://scikitlearn.com.cn/\n",
    "\n",
    "**以下模型为单次训练结果，多次运行结果参见train.py**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.随机森林模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.1随机森林模型1-100棵树"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Using backend ThreadingBackend with 4 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "building tree 1 of 100\n",
      "building tree 2 of 100building tree 3 of 100\n",
      "building tree 4 of 100\n",
      "\n",
      "building tree 5 of 100\n",
      "building tree 6 of 100\n",
      "building tree 7 of 100\n",
      "building tree 8 of 100\n",
      "building tree 9 of 100\n",
      "building tree 10 of 100\n",
      "building tree 11 of 100\n",
      "building tree 12 of 100\n",
      "building tree 13 of 100\n",
      "building tree 14 of 100\n",
      "building tree 15 of 100\n",
      "building tree 16 of 100\n",
      "building tree 17 of 100\n",
      "building tree 18 of 100\n",
      "building tree 19 of 100\n",
      "building tree 20 of 100\n",
      "building tree 21 of 100\n",
      "building tree 22 of 100\n",
      "building tree 23 of 100\n",
      "building tree 24 of 100\n",
      "building tree 25 of 100\n",
      "building tree 26 of 100\n",
      "building tree 27 of 100\n",
      "building tree 28 of 100\n",
      "building tree 29 of 100\n",
      "building tree 30 of 100\n",
      "building tree 31 of 100\n",
      "building tree 32 of 100\n",
      "building tree 33 of 100\n",
      "building tree 34 of 100\n",
      "building tree 35 of 100\n",
      "building tree 36 of 100\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done  33 tasks      | elapsed:  3.8min\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "building tree 37 of 100\n",
      "building tree 38 of 100\n",
      "building tree 39 of 100\n",
      "building tree 40 of 100\n",
      "building tree 41 of 100\n",
      "building tree 42 of 100\n",
      "building tree 43 of 100\n",
      "building tree 44 of 100\n",
      "building tree 45 of 100\n",
      "building tree 46 of 100\n",
      "building tree 47 of 100\n",
      "building tree 48 of 100\n",
      "building tree 49 of 100\n",
      "building tree 50 of 100\n",
      "building tree 51 of 100\n",
      "building tree 52 of 100\n",
      "building tree 53 of 100\n",
      "building tree 54 of 100\n",
      "building tree 55 of 100\n",
      "building tree 56 of 100\n",
      "building tree 57 of 100\n",
      "building tree 58 of 100\n",
      "building tree 59 of 100\n",
      "building tree 60 of 100\n",
      "building tree 61 of 100\n",
      "building tree 62 of 100\n",
      "building tree 63 of 100\n",
      "building tree 64 of 100\n",
      "building tree 65 of 100\n",
      "building tree 66 of 100\n",
      "building tree 67 of 100\n",
      "building tree 68 of 100\n",
      "building tree 69 of 100\n",
      "building tree 70 of 100\n",
      "building tree 71 of 100\n",
      "building tree 72 of 100\n",
      "building tree 73 of 100\n",
      "building tree 74 of 100\n",
      "building tree 75 of 100\n",
      "building tree 76 of 100\n",
      "building tree 77 of 100\n",
      "building tree 78 of 100\n",
      "building tree 79 of 100\n",
      "building tree 80 of 100\n",
      "building tree 81 of 100\n",
      "building tree 82 of 100\n",
      "building tree 83 of 100\n",
      "building tree 84 of 100\n",
      "building tree 85 of 100\n",
      "building tree 86 of 100\n",
      "building tree 87 of 100\n",
      "building tree 88 of 100\n",
      "building tree 89 of 100\n",
      "building tree 90 of 100\n",
      "building tree 91 of 100\n",
      "building tree 92 of 100\n",
      "building tree 93 of 100\n",
      "building tree 94 of 100\n",
      "building tree 95 of 100\n",
      "building tree 96 of 100\n",
      "building tree 97 of 100\n",
      "building tree 98 of 100\n",
      "building tree 99 of 100\n",
      "building tree 100 of 100\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done 100 out of 100 | elapsed: 10.6min finished\n",
      "[Parallel(n_jobs=4)]: Using backend ThreadingBackend with 4 concurrent workers.\n",
      "[Parallel(n_jobs=4)]: Done  33 tasks      | elapsed:    0.2s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MSE: 0.011356733866017094\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done 100 out of 100 | elapsed:    0.7s finished\n"
     ]
    }
   ],
   "source": [
    "#随机森林模型 100个树\n",
    "# 重要参数 n_estimators 弱学习器个数，默认100   oob_score  是否袋外采样 默认false  建议True\n",
    "#criterion 评价标准 回归RF有mae，默认mse 不用改\n",
    "# model = RandomForestRegressor(n_estimators=100, random_state=0,verbose=2)\n",
    "model2_1 = RandomForestRegressor(n_estimators=100,oob_score=True,verbose=2,n_jobs=4) #100棵树 开启袋外采样  打印状态  4个核心并行\n",
    "model2_1.fit(X_train,y_train)                    #训练集拟合\n",
    "preds2_1 = model2_1.predict(X_valid)             #进行预测\n",
    "# score2_1 = mean_absolute_error(y_valid, preds) #测量平均绝对误差MAE\n",
    "score2_1 = mean_squared_error(y_valid, preds2_1) #测量均方误差MSE\n",
    "# print('MAE:', score2_1) #0.034816310036587715\n",
    "print('MSE:', score2_1) #0.012138822486107472"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "z=zip(model2_1.feature_importances_,labels)\n",
    "z=sorted(z,reverse=True)[:5]\n",
    "x=[i[1] for i in z]\n",
    "width=[i[0] for i in z]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, \"Random Forest's feature importances\")"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10,5))\n",
    "plt.barh(x,width)\n",
    "plt.title(\"Random Forest's feature importances\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.2随机森林模型2-200棵树"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model2_2 = RandomForestRegressor(n_estimators=200,oob_score=True,verbose=1,n_jobs=4)\n",
    "#训练集拟合 \n",
    "model2_2.fit(X_train, y_train)\n",
    "# model2_2= joblib.load(\"model2_2.m\")   #如果已经保存模型，可以将上述两行注释掉，直接运行此行读取model2_2  之后类似处同理\n",
    "#进行预测\n",
    "preds2_2 = model2_2.predict(X_valid)\n",
    "#模型评价\n",
    "# score2_2 = mean_absolute_error(y_valid, preds2_2)\n",
    "score2_2 = mean_squared_error(y_valid, preds2_2)    #测量均方误差MSE\n",
    "# print('MAE:', score2_2) \n",
    "print('MSE:', score2_2) #0.011994223876487058"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# joblib.dump(model2_2, \"model2_2.m\") "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3.XGBoost模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.1 XGBoost模型-100个预测器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train_test=pd.DataFrame(X_train)\n",
    "X_train_test.columns=labels\n",
    "X_valid_test=pd.DataFrame(X_valid)\n",
    "X_valid_test.columns=labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "#XGBRegressor模型   参考文档 https://xgboost.readthedocs.io/en/latest/parameter.html#general-parameters\n",
    "# XGBClassifier(learning_rate =0.1,n_estimators=1000,max_depth=4,min_child_weight=6,gamma=0,subsample=0.8,colsample_bytree=0.8,reg_alpha=0.005,objective= 'binary:logistic',\n",
    "#  nthread=4,scale_pos_weight=1,seed=27)   #XGBoost的可调参数\n",
    "evals_result={}\n",
    "model3_1 = XGBRegressor(verbosity=1,evals_result=evals_result)   #默认n_estimators=100,XGBoost 默认开启并行，且进程数设置为按当前机器配置的最大核心数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[22:18:07] WARNING: src/objective/regression_obj.cu:152: reg:linear is now deprecated in favor of reg:squarederror.\n",
      "[0]\tvalidation_0-rmse:20.049\tvalidation_1-rmse:19.9566\n",
      "[1]\tvalidation_0-rmse:18.0571\tvalidation_1-rmse:17.9693\n",
      "[2]\tvalidation_0-rmse:16.2574\tvalidation_1-rmse:16.1818\n",
      "[3]\tvalidation_0-rmse:14.6388\tvalidation_1-rmse:14.5715\n",
      "[4]\tvalidation_0-rmse:13.185\tvalidation_1-rmse:13.1233\n",
      "[5]\tvalidation_0-rmse:11.8749\tvalidation_1-rmse:11.8186\n",
      "[6]\tvalidation_0-rmse:10.6939\tvalidation_1-rmse:10.6451\n",
      "[7]\tvalidation_0-rmse:9.63757\tvalidation_1-rmse:9.59229\n",
      "[8]\tvalidation_0-rmse:8.68249\tvalidation_1-rmse:8.6412\n",
      "[9]\tvalidation_0-rmse:7.82475\tvalidation_1-rmse:7.78833\n",
      "[10]\tvalidation_0-rmse:7.05075\tvalidation_1-rmse:7.01779\n",
      "[11]\tvalidation_0-rmse:6.35181\tvalidation_1-rmse:6.32494\n",
      "[12]\tvalidation_0-rmse:5.72513\tvalidation_1-rmse:5.70065\n",
      "[13]\tvalidation_0-rmse:5.16174\tvalidation_1-rmse:5.14014\n",
      "[14]\tvalidation_0-rmse:4.65669\tvalidation_1-rmse:4.63711\n",
      "[15]\tvalidation_0-rmse:4.20177\tvalidation_1-rmse:4.18367\n",
      "[16]\tvalidation_0-rmse:3.79127\tvalidation_1-rmse:3.7758\n",
      "[17]\tvalidation_0-rmse:3.42129\tvalidation_1-rmse:3.40924\n",
      "[18]\tvalidation_0-rmse:3.0902\tvalidation_1-rmse:3.0797\n",
      "[19]\tvalidation_0-rmse:2.7916\tvalidation_1-rmse:2.7829\n",
      "[20]\tvalidation_0-rmse:2.52324\tvalidation_1-rmse:2.51584\n",
      "[21]\tvalidation_0-rmse:2.28339\tvalidation_1-rmse:2.2766\n",
      "[22]\tvalidation_0-rmse:2.06777\tvalidation_1-rmse:2.06134\n",
      "[23]\tvalidation_0-rmse:1.87274\tvalidation_1-rmse:1.86811\n",
      "[24]\tvalidation_0-rmse:1.69789\tvalidation_1-rmse:1.69422\n",
      "[25]\tvalidation_0-rmse:1.54119\tvalidation_1-rmse:1.53801\n",
      "[26]\tvalidation_0-rmse:1.40061\tvalidation_1-rmse:1.39792\n",
      "[27]\tvalidation_0-rmse:1.27053\tvalidation_1-rmse:1.26904\n",
      "[28]\tvalidation_0-rmse:1.15785\tvalidation_1-rmse:1.15666\n",
      "[29]\tvalidation_0-rmse:1.05353\tvalidation_1-rmse:1.05283\n",
      "[30]\tvalidation_0-rmse:0.96299\tvalidation_1-rmse:0.962451\n",
      "[31]\tvalidation_0-rmse:0.881476\tvalidation_1-rmse:0.881818\n",
      "[32]\tvalidation_0-rmse:0.806067\tvalidation_1-rmse:0.806826\n",
      "[33]\tvalidation_0-rmse:0.741963\tvalidation_1-rmse:0.74303\n",
      "[34]\tvalidation_0-rmse:0.681446\tvalidation_1-rmse:0.682905\n",
      "[35]\tvalidation_0-rmse:0.630214\tvalidation_1-rmse:0.63217\n",
      "[36]\tvalidation_0-rmse:0.582365\tvalidation_1-rmse:0.584498\n",
      "[37]\tvalidation_0-rmse:0.540223\tvalidation_1-rmse:0.542619\n",
      "[38]\tvalidation_0-rmse:0.502782\tvalidation_1-rmse:0.505557\n",
      "[39]\tvalidation_0-rmse:0.470477\tvalidation_1-rmse:0.473501\n",
      "[40]\tvalidation_0-rmse:0.440779\tvalidation_1-rmse:0.443984\n",
      "[41]\tvalidation_0-rmse:0.414203\tvalidation_1-rmse:0.417407\n",
      "[42]\tvalidation_0-rmse:0.390782\tvalidation_1-rmse:0.394158\n",
      "[43]\tvalidation_0-rmse:0.369568\tvalidation_1-rmse:0.373022\n",
      "[44]\tvalidation_0-rmse:0.351319\tvalidation_1-rmse:0.354697\n",
      "[45]\tvalidation_0-rmse:0.335393\tvalidation_1-rmse:0.338982\n",
      "[46]\tvalidation_0-rmse:0.320683\tvalidation_1-rmse:0.324268\n",
      "[47]\tvalidation_0-rmse:0.308292\tvalidation_1-rmse:0.311888\n",
      "[48]\tvalidation_0-rmse:0.296984\tvalidation_1-rmse:0.300786\n",
      "[49]\tvalidation_0-rmse:0.286997\tvalidation_1-rmse:0.290878\n",
      "[50]\tvalidation_0-rmse:0.278157\tvalidation_1-rmse:0.282031\n",
      "[51]\tvalidation_0-rmse:0.270614\tvalidation_1-rmse:0.2748\n",
      "[52]\tvalidation_0-rmse:0.263908\tvalidation_1-rmse:0.268204\n",
      "[53]\tvalidation_0-rmse:0.257027\tvalidation_1-rmse:0.261473\n",
      "[54]\tvalidation_0-rmse:0.251906\tvalidation_1-rmse:0.256556\n",
      "[55]\tvalidation_0-rmse:0.247833\tvalidation_1-rmse:0.252448\n",
      "[56]\tvalidation_0-rmse:0.243189\tvalidation_1-rmse:0.247975\n",
      "[57]\tvalidation_0-rmse:0.239787\tvalidation_1-rmse:0.2445\n",
      "[58]\tvalidation_0-rmse:0.235068\tvalidation_1-rmse:0.239638\n",
      "[59]\tvalidation_0-rmse:0.232083\tvalidation_1-rmse:0.236755\n",
      "[60]\tvalidation_0-rmse:0.229423\tvalidation_1-rmse:0.234103\n",
      "[61]\tvalidation_0-rmse:0.227776\tvalidation_1-rmse:0.232533\n",
      "[62]\tvalidation_0-rmse:0.226032\tvalidation_1-rmse:0.23074\n",
      "[63]\tvalidation_0-rmse:0.224121\tvalidation_1-rmse:0.22875\n",
      "[64]\tvalidation_0-rmse:0.222565\tvalidation_1-rmse:0.227245\n",
      "[65]\tvalidation_0-rmse:0.220191\tvalidation_1-rmse:0.224816\n",
      "[66]\tvalidation_0-rmse:0.218634\tvalidation_1-rmse:0.223245\n",
      "[67]\tvalidation_0-rmse:0.2169\tvalidation_1-rmse:0.221329\n",
      "[68]\tvalidation_0-rmse:0.215651\tvalidation_1-rmse:0.220103\n",
      "[69]\tvalidation_0-rmse:0.213833\tvalidation_1-rmse:0.218207\n",
      "[70]\tvalidation_0-rmse:0.211058\tvalidation_1-rmse:0.215452\n",
      "[71]\tvalidation_0-rmse:0.210034\tvalidation_1-rmse:0.214367\n",
      "[72]\tvalidation_0-rmse:0.208561\tvalidation_1-rmse:0.212839\n",
      "[73]\tvalidation_0-rmse:0.207427\tvalidation_1-rmse:0.211591\n",
      "[74]\tvalidation_0-rmse:0.206661\tvalidation_1-rmse:0.210938\n",
      "[75]\tvalidation_0-rmse:0.20555\tvalidation_1-rmse:0.209819\n",
      "[76]\tvalidation_0-rmse:0.204636\tvalidation_1-rmse:0.20888\n",
      "[77]\tvalidation_0-rmse:0.203871\tvalidation_1-rmse:0.208103\n",
      "[78]\tvalidation_0-rmse:0.202965\tvalidation_1-rmse:0.207145\n",
      "[79]\tvalidation_0-rmse:0.201951\tvalidation_1-rmse:0.206117\n",
      "[80]\tvalidation_0-rmse:0.200768\tvalidation_1-rmse:0.204878\n",
      "[81]\tvalidation_0-rmse:0.200135\tvalidation_1-rmse:0.204256\n",
      "[82]\tvalidation_0-rmse:0.198861\tvalidation_1-rmse:0.202927\n",
      "[83]\tvalidation_0-rmse:0.198263\tvalidation_1-rmse:0.202323\n",
      "[84]\tvalidation_0-rmse:0.197724\tvalidation_1-rmse:0.201771\n",
      "[85]\tvalidation_0-rmse:0.194575\tvalidation_1-rmse:0.198155\n",
      "[86]\tvalidation_0-rmse:0.192545\tvalidation_1-rmse:0.195983\n",
      "[87]\tvalidation_0-rmse:0.191857\tvalidation_1-rmse:0.195351\n",
      "[88]\tvalidation_0-rmse:0.191427\tvalidation_1-rmse:0.194906\n",
      "[89]\tvalidation_0-rmse:0.190316\tvalidation_1-rmse:0.193652\n",
      "[90]\tvalidation_0-rmse:0.189863\tvalidation_1-rmse:0.193217\n",
      "[91]\tvalidation_0-rmse:0.188918\tvalidation_1-rmse:0.192337\n",
      "[92]\tvalidation_0-rmse:0.188526\tvalidation_1-rmse:0.191943\n",
      "[93]\tvalidation_0-rmse:0.188149\tvalidation_1-rmse:0.191582\n",
      "[94]\tvalidation_0-rmse:0.186892\tvalidation_1-rmse:0.19025\n",
      "[95]\tvalidation_0-rmse:0.18567\tvalidation_1-rmse:0.188929\n",
      "[96]\tvalidation_0-rmse:0.185328\tvalidation_1-rmse:0.188589\n",
      "[97]\tvalidation_0-rmse:0.184626\tvalidation_1-rmse:0.187942\n",
      "[98]\tvalidation_0-rmse:0.1843\tvalidation_1-rmse:0.187592\n",
      "[99]\tvalidation_0-rmse:0.183933\tvalidation_1-rmse:0.187194\n",
      "MSE: 0.03504203789468911\n"
     ]
    }
   ],
   "source": [
    "eval_s = [(X_train_test, y_train),(X_valid_test,y_valid)]\n",
    "model3_1.fit(X_train_test, y_train,eval_set=eval_s)\n",
    "# model3_1 = joblib.load(\"model3_1.joblib.dat\")\n",
    "#进行预测\n",
    "preds3_1 = model3_1.predict(X_valid_test)\n",
    "#模型评价\n",
    "# score3_1 = mean_absolute_error(y_valid, preds3_1)\n",
    "score3_1= mean_squared_error(y_valid, preds3_1)    #测量均方误差MSE\n",
    "# print('MAE:', score2_2) \n",
    "print('MSE:', score3_1) #0.010711505144585076"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "# joblib.dump(model3_1, \"model3_1.joblib.dat\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[20 20 20 21 21 22 22 22 23 23 24 24 24 25 25 26 26 26 27 27 28 28 28 29\n",
      " 29 30 30 30 31 31 32 32 32 33 33 34 34 34 35 35 36 36 36 37 37 38 38 38\n",
      " 39 39 40 40 40 41 41 42 42 42 43 43 44 44 44 45 45 46 46 46 47 47 48 48\n",
      " 48 49 49 50 50 50 51 51 52 52 52 53 53 54 54 54 55 55 56 56 56 57 57 58\n",
      " 58 58 59 59 60 60 60 61 61 62 62 62 63 63 64 64 64 65 65 66 66 66 67 67\n",
      " 68 68 68 69 69 70 70 70 71 71 72 72 72 73 73 74 74 74 75 75 76 76 76 77\n",
      " 77 78 78 78 79 79 80 80 80 81 81 82 82 82 83 83 84 84 84 85 85 86 86 86\n",
      " 87 87 88 88 88 89 89 90 90 90 91 91 92 92 92 93 93 94 94 94 95 95 96 96\n",
      " 96 97 97 98 98 98 99 99]\n"
     ]
    },
    {
     "data": {
      "image/png": "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iHRCV111Fd988w0XXHABGRkZ3H///axfvx4z47HHHqN///6ceuqpAFx66aX07t2brKwsTjrpJJYuXdrYzrXXXsvdd98NQGFhIf369eOBBx6gZ8+e9OnTh8cff7xd++7cuZMLLriALl26cOyxx3L33XczceLEFr9LQ+7HH3+c3NxccnJyeOihh5g3bx6jRo0iOzubqVOnNu6/evVqTj75ZLKysujevTuXX35547YVK1Zwxhln0LVrV4YMGcLzzz8fgt5uGxVfIiIindCMGTPo378///znP9mzZw+3335747aPP/6Y5cuX88477wBwzjnn8PXXX7Nt2zbGjh3LlVdeecB2t2zZQmlpKRs3buSxxx7jJz/5Cbt3727zvj/5yU9IT09ny5YtPPHEEzzxxBOH/E5z5szh66+/5rnnnuOWW27hd7/7He+//z5Lly7l+eef5+OPPwbgl7/8JWeeeSa7d+9mw4YN/PSnPwWgoqKCM844gylTprBt2zaeeeYZfvzjH+9XbEaCii8REZE4M23aNNLT00lNTQXg+uuvJzMzk+TkZKZNm8bixYspLS1t8djExETuueceEhMTOffcc8nIyGDlypVt2reuro6XXnqJe++9l7S0NIYPH84111xzyNy//OUvSUlJ4cwzzyQ9PZ3JkyfTs2dP+vbty4knnsjChQsbz1tUVMSmTZtISUlpvKL2+uuvk5+fz3XXXUdCQgJjx47lkksu4cUXX2xPN7abHi8kIiISRnZvu+dlN3K/Cu2k/tzc3Mbluro6fvGLX/DCCy+wfft2fL7AdZkdO3aQlZX1nWO7detGQsK35UNaWhp79uxp8TwH2nf79u3U1tbul6Pp8oH06tWrcTk1NfU7nxty3H///fzyl79k3Lhx5OTkcNttt3H99ddTVFTEnDlzyM7ObjyutraWq6666pDnDiUVXyIiImEU6sKpLcxaLvyarn/66ad57bXXeP/998nPz6e0tJScnJyw/oqzR48eJCQksGHDBo444ggAiouLQ9Z+7969eeSRRwCYNWsWp59+OieddBK5ubmcfPLJvPfeeyE7V3to2FFERKST6tWrF2vXrj3oPuXl5SQnJ9OtWzf27t3LXXfdFfZcfr+fiy++mGnTprF3715WrFjB3//+95C1/8ILL7BhwwYAcnJyMDP8fj/nn38+q1atYsaMGdTU1FBTU8O8efNYvnx5yM7dGiq+REREOqk777yT3/72t2RnZ/PHP/6xxX2uvvpq8vLy6Nu3L8OHD2fChAkRyfbggw9SWlpK7969ueqqq5g8eTLJyckhaXvevHmMHz+ejIwMJk2axJ///GcGDBhAZmYm7777Ls8++yyHHXYYvXv35o477qCqqiok520t3WRVRESknaL9Jqux5I477mj85WO00E1WRUREpNNYsWIFS5YswTnH3Llzeeyxx7jooou8jhURmnAvIiIiEVdeXs7kyZPZtGkTPXv25LbbbuPCCy/0OlZEaNhRRESknTTs2Llp2FFERESkE1DxJSIiIhJBKr5EREREIkjFl4iIiEgEqfgSERERiSAVXyIiIrKfwsJC+vXr1/h5xIgRFBYWeheok9F9vkREROSgli5d6nWETkVXvkREREQiSMWXiIhIJ3Tffffx/e9/f791N998MzfddBMAjz/+OMOGDSMzM5OBAwfy8MMPH7Ct/Px83n//fQCmTZvGZZddxtVXX01mZiYjRozgiy++aNx3wYIFjBkzhszMTC699FIuv/xy7r777hbbnT59OieccAK33nor2dnZDBw4kM8++4zp06eTm5tLz54993vW45tvvsnw4cPJzMykb9+++z0s/PXXX2f06NFkZ2dz/PHHs2TJkrZ3WoSo+BIREemEJk+ezJtvvklZWRkAdXV1PP/880yZMgWAnj178vrrr1NWVsbjjz/OrbfeyoIFC1rV9j/+8Q+uuOIKSkpKmDRpElOnTgWgurqaiy66iGuvvZZdu3YxefJkXnnllYO2NWfOHEaNGsXOnTuZMmUKV1xxBfPmzWP16tU8+eSTTJ06lT179gDwwx/+kIcffpjy8nK++uorTj31VCBQ8F1//fU8/PDD7Ny5kxtuuIFJkyZRVVXVrr4LNxVfIiIinVBeXh5jx47l1VdfBeDDDz8kLS2NCRMmAHDeeecxaNAgzIyTTz6ZM888k5kzZ7aq7YkTJ3Luuefi9/u56qqrWLx4MQCzZ8+mtraWm266icTERC6++GLGjRt30LYGDBjAddddh9/v5/LLL6e4uJh77rmH5ORkzjzzTJKSkli9ejUAiYmJLFu2jLKyMnJychg7diwAjzzyCDfccAPjx4/H7/dzzTXXkJyczOzZs9vTdWGn4ktERCSczDr+aqcpU6bwzDPPAPD00083XvUCeOut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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "eval_dict= model3_1.evals_result()\n",
    "val0 = eval_dict['validation_0']['rmse']\n",
    "val1 = eval_dict['validation_1']['rmse']\n",
    "# logger.error(cv_output)\n",
    "x_list = np.linspace(20, len(val0), num=200, dtype=int, endpoint=False)\n",
    "print(x_list)\n",
    "y_val0 = np.array([val0[x] for x in x_list])**2\n",
    "y_val1 = np.array([val1[x] for x in x_list])**2\n",
    "# 开始画图\n",
    "plt.figure(figsize=(10,6))\n",
    "plt.title('Result Analysis')\n",
    "plt.plot(x_list, y_val0, color='green', label='training mse')\n",
    "plt.plot(x_list, y_val1, color='red', label='valing mse')\n",
    "plt.legend()  # 显示图例\n",
    "plt.xlabel('iteration times')\n",
    "plt.ylabel('mse')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:title={'center':'XGBoost with 100 estimators feature importance'}, xlabel='F score', ylabel='Features'>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(14,7))\n",
    "plot_importance(model3_1,ax=ax,max_num_features=10,title='XGBoost with 100 estimators feature importance')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.2 XGBoost模型-800个预测器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# help(XGBRegressor)\n",
    "model3_2 = XGBRegressor(n_estimators=800,verbosity=1)   #默认n_estimators=500   设置verbosity=1，=0不显示任何输出，看不到进度...\n",
    "model3_2.fit(X_train_test, y_train)\n",
    "# model3_2 = joblib.load(\"model3_2.joblib.dat\")\n",
    "#进行预测\n",
    "preds3_2 = model3_2.predict(X_valid_test)\n",
    "#模型评价\n",
    "score3_2= mean_squared_error(y_valid, preds3_2)    #测量均方误差MSE\n",
    "# print('MAE:', score2_2) \n",
    "print('MSE:', score3_2)     #0.007166229080095838\n",
    "#速度较慢，但mse确实有一定降低"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fig, ax = plt.subplots(figsize=(14,14))\n",
    "plot_importance(model3_2,ax=ax,max_num_features=10,title='XGBoost with 800 estimators feature importance')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# joblib.dump(model3_2, \"model3_2.joblib.dat\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "目前来看XGBoost模型效果最好，可以进一步考虑调整树深度max_depth等参数，对于SVM方法，样本太多，速度极慢，不太适合，已弃用"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4.深度森林"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#深度森林模型参数较少，而且对参数不太敏感，这里只测试一次   参考文档https://deep-forest.readthedocs.io/en/latest/\n",
    "model4 = CascadeForestRegressor(verbose=1,n_jobs=4)\n",
    "model4.fit(X_train, y_train)\n",
    "# joblib.load('model4.sav')\n",
    "#进行预测\n",
    "preds4 = model4.predict(X_valid)\n",
    "#模型评价\n",
    "score4= mean_squared_error(y_valid, preds4)    #测量均方误差MSE\n",
    "print('MSE:', score4)  #0.08480740421585917"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['model4.sav']"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# joblib.dump(model4, \"model4.sav\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5.神经网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration 1, loss = 29.30208332\n",
      "Iteration 2, loss = 8.02786137\n",
      "Iteration 3, loss = 7.57774767\n",
      "Iteration 4, loss = 7.33724230\n",
      "Iteration 5, loss = 6.89718200\n",
      "Iteration 6, loss = 6.57032388\n",
      "Iteration 7, loss = 6.35756704\n",
      "Iteration 8, loss = 6.16514578\n",
      "Iteration 9, loss = 6.03398389\n",
      "Iteration 10, loss = 5.91202187\n",
      "Iteration 11, loss = 5.83260035\n",
      "Iteration 12, loss = 5.73938930\n",
      "Iteration 13, loss = 5.63679103\n",
      "Iteration 14, loss = 5.57311437\n",
      "Iteration 15, loss = 5.49573884\n",
      "Iteration 16, loss = 5.46999372\n",
      "Iteration 17, loss = 5.39695514\n",
      "Iteration 18, loss = 5.35542714\n",
      "Iteration 19, loss = 5.32420208\n",
      "Iteration 20, loss = 5.24904252\n",
      "Iteration 21, loss = 5.21864884\n",
      "Iteration 22, loss = 5.20108301\n",
      "Iteration 23, loss = 5.13719289\n",
      "Iteration 24, loss = 5.12850170\n",
      "Iteration 25, loss = 5.09349840\n",
      "Iteration 26, loss = 5.06328894\n",
      "Iteration 27, loss = 5.03779025\n",
      "Iteration 28, loss = 5.02061204\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/root/anaconda3/envs/machinelearning/lib/python3.7/site-packages/sklearn/neural_network/_multilayer_perceptron.py:619: UserWarning: Training interrupted by user.\n",
      "  warnings.warn(\"Training interrupted by user.\")\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MSE: 10.4740830693068\n"
     ]
    }
   ],
   "source": [
    "#失败品，MSE明显过大\n",
    "model5= MLPRegressor(hidden_layer_sizes=300,max_iter=500,verbose=False)    #默认隐藏层100\n",
    "model5.fit(X_train, y_train)\n",
    "# model5= joblib.load(\"model5.m\")\n",
    "#进行预测\n",
    "preds5 = model5.predict(X_valid)\n",
    "#模型评价\n",
    "score5= mean_squared_error(y_valid, preds5)    #测量均方误差MSE \n",
    "print('MSE:', score5) #17.83978465940722"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['model5.m']"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "joblib.dump(model5, \"model5.m\") "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MAE: 3.5145003916485815\n"
     ]
    }
   ],
   "source": [
    "#KNN回归 失败品 MAE明显过大\n",
    "from sklearn.neighbors import KNeighborsRegressor\n",
    "knn = KNeighborsRegressor(n_neighbors=10)\n",
    "my_pipeline_knn = Pipeline(steps=[('preprocessor', preprocessor),\n",
    "                              ('model', knn)\n",
    "                             ])\n",
    "# Preprocessing of training data, fit model \n",
    "my_pipeline_knn.fit(X_train, y_train)\n",
    "\n",
    "# Preprocessing of validation data, get predictions\n",
    "preds_knn = my_pipeline_knn.predict(X_valid)\n",
    "\n",
    "# Evaluate the model\n",
    "score = mean_absolute_error(y_valid, preds_knn)\n",
    "print('MAE:', score)    #MAE 3.5145  耗时一节课"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  },
  "latex_envs": {
   "LaTeX_envs_menu_present": true,
   "autoclose": false,
   "autocomplete": true,
   "bibliofile": "biblio.bib",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 1,
   "hotkeys": {
    "equation": "Ctrl-E",
    "itemize": "Ctrl-I"
   },
   "labels_anchors": false,
   "latex_user_defs": false,
   "report_style_numbering": false,
   "user_envs_cfg": false
  },
  "toc-autonumbering": false,
  "toc-showcode": true,
  "toc-showmarkdowntxt": false,
  "toc-showtags": false
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
